package com.yantong.mapper;

import com.yantong.pojo.*;
import com.yantong.pojo.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface OrderMapper {
    /**
     * 条件统计
     * @param example
     * @return
     */
    int countByExample(OrderExample example);

    /**
     * 提交删除
     * @param example
     * @return
     */
    int deleteByExample(OrderExample example);

    /**
     * 主键删除
     * @param id
     * @return
     */
    int deleteByPrimaryKey(Long id);

    /**
     * 全字段插入
     * @param record
     * @return
     */
    int insert(Order record);

    /**
     * 适配插入
     * @param record
     * @return
     */
    int insertSelective(Order record);

    /**
     * 条件查询
     * @param example
     * @return
     */
    List<Order> selectByExample(OrderExample example);

    /**
     * 获取详情
     * @param id
     * @return
     */
    Order selectByPrimaryKey(Long id);

    /**
     * 条件适配更新
     * @param record
     * @param example
     * @return
     */
    int updateByExampleSelective(@Param("record") Order record, @Param("example") OrderExample example);

    /**
     * 条件全字段更新
     * @param record
     * @param example
     * @return
     */
    int updateByExample(@Param("record") Order record, @Param("example") OrderExample example);

    /**
     * 主键适配更新
     * @param record
     * @return
     */
    int updateByPrimaryKeySelective(Order record);

    /**
     * 主键全字段更新
     * @param record
     * @return
     */
    int updateByPrimaryKey(Order record);

    /**
     * 统计会员总消费金额
     * @author 宋立明
     * @date 2018年8月30日 下午4:48:37
     * @param example
     * @return
     */
    BigDecimal paypriceSum(OrderExample example);

    /**
     * 条件统计订单数
     * @param params
     * @return
     */
    int countByParams(ListOrderParams params);

    /**
     * 条件查询订单列表
     * @param params
     * @param rowBounds
     * @return
     */
    List<Order> listByParams(ListOrderParams params, RowBounds rowBounds);
    
    /**
     * 条件查询订单商品列表
     * @param params
     * @param rowBounds
     * @return
     */
    List<OrderProductDetailVo> ordProductlistByParams(OrderProductDetailVo params, RowBounds rowBounds);
    
    /**
     * 得到平台商品的总成本，总利益
     * @param params
     * @return
     */
    OrderProductDetailVo  getBaseProductMoneyTotal(OrderProductDetailVo params);
    
    /**
     * 条件查询平台订单商品列表
     * @param params
     * @param rowBounds
     * @return
     */
    List<OrderProductDetailVo> ordProductBaselistByParams(OrderProductDetailVo params, RowBounds rowBounds);
    
    /**
     * 条件查询平台订单商品列表导出没有分页 
     * @param params
     * @param rowBounds
     * @return
     */
    List<OrderProductDetailVo> ordProductBaselistByParamsExp(OrderProductDetailVo params);
    
    /**
     * 条件统计订单数
     * @param params
     * @return
     */
    int ordProcountByParams(OrderProductDetailVo params);
    
    
    /**
     * 条件统计订单数 平台商品订单
     * @param params
     * @return
     */
    int ordProcountbaseByParams(OrderProductDetailVo params);
    

    /**
     * 条件查询订单列表   不分页
     * @param params
     * @return
     */
    List<Order> listByParams(ListOrderParams params);

	/**
	 * 条件查询订单列表   不分页
	 * @param params
	 * @return
	 */
	int findListByParamsCount(ListOrderParams params);


	Double findListByParamsPriceSum(ListOrderParams params);

    /**
     * 获取用户各状态的订单数量
     * @param mid
     * @return
     */
    List<Map<String,Object>> getStatusCounts(Long mid);

    /**
     * 获取用户各状态的订单数量
     * @param mid
     * @return
     */
    List<Map<String,Object>> getCanyinOrderCounts(Long mid);

    /**
     * 获取门店个人业绩列表，分页
     * @param centreId 商户ID
     * @param start 开始时间
     * @param end 结束时间
     * @param rowBounds 分页参数
     * @return
     */
    List<AchieveFlow> getAchieveFlowBase(@Param("centreId") Long centreId, @Param("start") Date start, @Param("end") Date end, RowBounds rowBounds);

    /**
     * 自动确认收货
     * @param date
     * @param status
     * @param centreId
     * @return
     */
    int autoDelivery(@Param("date") Date date, @Param("status") Integer status, @Param("centreId") Long centreId);

    /**
     * 获取收货时间距离当前时间超过7天的订单，用以结算佣金和积分
     * @param sevenDate
     * @param start
     * @param centreId
     * @param rowBounds
     * @return
     */
    List<Order> listSuccessOrders(@Param("sevenDate") Date sevenDate, @Param("start") Date start, @Param("centreId") Long centreId, RowBounds rowBounds);

    /**
     * 统计时间范围内下单会员数
     * @param start
     * @param end
     * @param centreId
     * @return
     */
    int countMidByTime(@Param("start") Date start, @Param("end") Date end, @Param("centreId") Long centreId);

    /**
     * 统计时间范围内的下单总金额
     * @param start
     * @param end
     * @param centreId
     * @return
     */
    double countPriceByTime(@Param("start") Date start, @Param("end") Date end, @Param("centreId") Long centreId);

    /**
     * 获取用户行为(下单用户数)走势
     * @param start
     * @param end
     * @param centreId
     * @return
     */
    List<Map<String,Object>> getMemberActionTrend(@Param("start") Date start, @Param("end") Date end, @Param("centreId") Long centreId);

    /**
     * 获取
     * @param start
     * @param centreId
     * @return
     */
    List<Map<String,Object>> getNewOrders(@Param("start") Date start, @Param("centreId") Long centreId);

     /**
      * 提醒用户提货订单
      * @return
      */
    List<OrdVo> getRemindOrd(Map<String, Object> map);

	int updateOrderPayType(Map<String, Object> queryMap);

	/**
	 * 更新订单支付通道
	 * @param updMap
	 * @return
	 */
	int updateOrderChannelByMap(Map<String, Object> updMap);



	 /**
     * 售后订单条件查询订单列表
     * @param params
     * @param rowBounds
     * @return
     */
    List<WorkListVo> workOrderlistByParams(ListOrderParams params, RowBounds rowBounds);

    /**
     *工单 条件统计订单数
     * @param params
     * @return
     */
    int countWorkOrderByParams(ListOrderParams params);
    /**
     * 更新订单支付参数JSON
     * @param updMap
     * @return
     */
	int updOrderPayAttach(Map<String, Object> updMap);

	List<Order> selectOrderByOutTradeNo(String outTradeNo);
	/**
	 * 导出订单商品
	 * @param params
	 * @return
	 */
	List<OrderProductDetailVo> ordProductlistByParams1(OrderProductDetailVo params);
	/**
	 * 售后商品列表
	 * @param params
	 * @param rowBounds
	 * @return
	 */
	List<AfterSaleProductVo> listAfterSaleProduct(ListAfterProductParams params, RowBounds rowBounds);

	int countAfterSaleProduct(ListAfterProductParams params);

	/**
	 * 得到今天下单支付完成代发货的订单金额
	 * @return
	 */
	String getAllOrderPriceByStu();

	/**
	 * 修改订单状态
	 * @param outTradeNo
	 * @return
	 */
	int updOrderStu(Long outTradeNo);



    Order getByPayNoSumPrice(String payNo);

    int updateOpenid(Order order1);

    /**
     * 得到订单会员总总订单价格
     * @param mid
     * @return
     */
   Long getTotalMoneyByMid(Long mid);

   /**
    * 推荐购买版本列表
    * @param params
    * @return
    */
   List<OrderProductDetailVo> getOrdByReferrals(OrderProductDetailVo params, RowBounds rowBounds);

   /**
    * 得到拼团商品订单
    * @param vo
    * @return
    */
   List<SpellGroupOrdVo> getSpellGroupOrd(SpellGroupOrdVo vo);

   /**
    * 得到拼团商品订单
    * @param vo
    * @return
    */
   List<SpellGroupOrdVo> getSpellGroupOrdByStu(SpellGroupOrdVo vo);

   /**
    * 修改
    * @param vo
    * @return
    */
    int updateSpellGroupOrdByStu(SpellGroupOrdVo vo);

    /**
     * 得到跑p任务拼团中订单
     * @return
     */
    List<OrderProductDetailVo>  getTaskSpellGroupOrd();


    /**
     * 得到发起人拼团中订单
     * @return
     */
    List<OrderProductDetailVo>  getSpellGroupByOrderId(Long id);

    /**
     * 修改状态
     * @param vo
     * @return
     */
     int updateSpellGroupOrdStu(SpellGroupOrdVo vo);

     /**
      * 得到所有平团的订单
      * @param vo
      * @return
      */
     List<Order> getOrderByStu(SpellGroupOrdVo vo);

	List<Order> getOrderByTeam(SpellGroupOrdVo vo);

     /**
      * 得到拼团内订单的用户头像昵称
      * @param vo
      * @return
      */
     List<SpellGroupOrdVo> getGroupOrdHead(OrderProductDetailVo vo);

     /**
      * 得到发起人拼团订单
      * @param vo
      * @return
      */
     List<SpellGroupOrdVo> getSpellGroupOrdById(Long id);

     /**
      * 查询用户是否参与过拼团
      * @param vo
      * @return
      */
     List<Order> getSpellGroupOrdByMid(SpellGroupOrdVo vo);

     /**
      * 修改拼团人数
      * @param id
      * @return
      */
     int changePeoplenum(SpellGroupOrdVo vo);

    int countDeliverByParams(ListOrderParams params);

    List<Order> listDeliverByParams(ListOrderParams params, RowBounds rowBounds);

    /**
     * 外卖售后订单条件查询订单列表
     * @param params
     * @param rowBounds
     * @return
     */
    List<Order> foodWorkOrderlistByParams(ListOrderParams params, RowBounds rowBounds);

    int countFoodWorkOrderByParams(ListOrderParams params);

    /**
     * 查看拼团订单的人数
     * @param sgorderId
     * @return
     */
    int getSpellGroupOrdCount(Long sgorderId);

    Integer getSpellGroupCountByProductId(@Param("productId") Long productId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

	/**
	 * 查询店主订单数
	 *
	 * @param params 参数信息
	 * @return int
	 * @author liaozhaogui
	 * @date 2020/10/9 13:53
	 */
	int getCentreOrderCount(Map params);

	/**
	 * 查询店主当日收益
	 *
	 * @param params 参数信息
	 * @return java.math.BigDecimal
	 * @author liaozhaogui
	 * @date 2020/10/9 13:54
	 */
	BigDecimal getMarchantIncome(Map params);

    /**
     *  根据分公司或者代理centreId查询总订单数量
     **/
    int getAgentOrderCount(Long centreId);

	/**
	 *  根据分公司或者代理centreId查询订单总金额
	 **/
	int getCentreOrderPayPirceSum(Long centreId);

    double getAllTurnover(@Param("centerId") Long centerId, @Param("dateStr") String dateStr);

    /**
     * 数据中心获取成功订单数
     *
     */
    int getCentreOrderNum(Long centreId);
	/**
	 * 数据中心获取当前前一天成功订单数
	 *
	 */
    int getLastDayCentreOrderNum(@Param("centreId") Long centreId, @Param("payTime") String payTime);

	/**
	 * 数据中心获取成功订单的金额
	 *
	 */
	Double getCentreOrderSum(Long centreId);
	/**
	 * 数据中心获取当前前一天成功订单的金额
	 *
	 */
	Double getLastDayCentreOrderSum(@Param("centreId") Long centreId, @Param("payTime") String payTime);

	/**
	 * 数据中心获取未支付订单数
	 *
	 */
	int getUnpaidCentreOrderNum(Long centreId);
	/**
	 * 数据中心获取当前前一天未支付订单数
	 *
	 */
	int getUnpaidLastDayCentreOrderNum(@Param("centreId") Long centreId, @Param("payTime") String payTime);

	/**
	 * 数据中心获取当月统计订单收益
	 *
	 */
	List<DataCenterVo> getMonthOrderSumList(@Param("centreId") Long centreId, @Param("payTimeStart") String payTimeStart,
                                            @Param("payTimeEnd") String payTimeEnd);

	DataCenterVo getMonthProductSum(@Param("centreId") Long centreId, @Param("payTime") String payTime);

	/**
	 * 数据中心获取年统计订单收益
	 *
	 */
	List<DataCenterVo> getYearOrderSumList(@Param("centreId") Long centreId, @Param("payTimeStart") String payTimeStart,
                                           @Param("payTimeEnd") String payTimeEnd);
	Integer getOrderBYTotal(@Param("orderType") Integer orderType, @Param("centreId") Long centreId, @Param("productId") Long productId);
	/**
	 * 获取最新的门店申请订单
	 */
	Order getTeamOrder(@Param("mid") Long mid);
}